function Anim(_type, frames, frameLengths, looping){
	this.type = _type;
	this.frames = frames;
	this.frameLengths = frameLengths;
	this.randomStart = false;
	this.blendStart = true; 
	if(frames.length != frameLengths.length){
		console.warn("Frames and FrameLengths arrays must be of same size");
	}
	if(this.type == Anim.birth){
		this.blendStart = false;
	}
	
	this.frameTimes = [];
	this.posKeys = null;
	var sum = 0;
	for(var i=0; i<frames.length;++i){
		this.frameLengths[i] *= Anim.timeMultiplier;
		sum += this.frameLengths[i];
		this.frameTimes[i] = sum;
	}

	this.endTime = this.frameTimes[this.frames.length-1] -1;
	this.numberOfFrames = frames.length;
	this.looping = looping;
	//used for sword lunge anims
	this.special_variant = this.type;
	this.nextType = -1;
	Anim.last = this;
}

function AnimPosKey(_startTime, _x,_y,_z, _scale){
	this.x = _x;
	this.y = _y;
	this.z = _z;
	this.startTime = _startTime;
	if(_scale === void 0){_scale = 1;}
	this.scale = _scale;
}

Anim.last = null;
Anim.timeMultiplier = 2;
Anim.maxBlendTime = 8;
Anim.stand = 0;
Anim.walk = 1;
Anim.attack = 2;
Anim.death = 3;
Anim.birth = 4;
Anim.walkFront = 5;
Anim.walkBack = 6;
Anim.walkRight = 7;
Anim.walkLeft = 8;
Anim.grabbed = 9;
Anim.attack_pistol = 10;
Anim.attack_rifle = 11;
Anim.attack_hip = 12;
Anim.attack_bomb = 13;
Anim.attack_pistol_sword = 14;
Anim.attack_pistol_sword_lunge = 15;
Anim.attack_hip_melee = 16;
Anim.attack_rifle_melee = 17;
Anim.attack_drink = 18;
Anim.attack_violin = 19;
Anim.birth_training = 20;
Anim.death_special = 21;
Anim.jump = 22;
Anim.attack_bomb_sword = 23;
Anim.attack_bomb_sword_lunge = 24; 
Anim.switch_bomb = 25;
Anim.attack_sword = 26;
Anim.attack_sword_lunge = 27; 
Anim.sprint = 28;
Anim.hang = 29;
Anim.hang_start = 30;
Anim.hang_end = 31;
Anim.reload = 32;
Anim.attack_sword_chop = 33; 
Anim.charge = 34;
Anim.attack_javelin = 35;

Anim.getEmpty = function(){
	var a =[];
	a[ Anim.stand ] = new Anim(Anim.stand, [0],[3],true);
	a[ Anim.attack ] = new Anim(Anim.attack, [0],[1],true);
	a[ Anim.walk ] = new Anim(Anim.walk, [0],[1],true);
	a[ Anim.death ] = new Anim(Anim.death, [0],[1],true);
	a[ Anim.birth]  = a[Anim.stand];
	a[ Anim.grabbed ] = a[Anim.stand];
	a[ Anim.jump ] = a[Anim.stand];
	return a;
}
Anim.clone = function(src){
	var dest = [];
	for(var i=0;i<src.length;++i){
		dest[i] = src[i];
	}
	return dest;
}
//deep copy
Anim.clone_value = function(src){
	var dest = [];
	for(var i=0;i<src.length;++i){
		if(src[i]){
			dest[i] = Object.assign(new Object(), src[i]);
			dest[i].frames = src[i].frames.slice();
			dest[i].frameLengths = src[i].frameLengths.slice();
			dest[i].frameTimes = src[i].frameTimes.slice();
		}
	}
	return dest;
}

Anim.Empty = Anim.getEmpty();

Anim.CrusaderAnim = Anim.getEmpty();
Anim.CrusaderAnim[ Anim.stand ] = new Anim(Anim.stand, [0],[1],true);
Anim.CrusaderAnim[ Anim.walk ] = new Anim(Anim.walk, [1,2,3,4,5,6,7,8],[1,1,1,1,1,1,1,1],true);
Anim.CrusaderAnim[ Anim.attack ] = new Anim(Anim.attack, [9,10,11,12,13,14,9],[1,3,1,1,3,2,1],false);
Anim.CrusaderAnim[ Anim.death ] = new Anim(Anim.death, [15,16,17],[2,2,2],false);

Anim.HeroAnim = Anim.getEmpty();
Anim.HeroAnim[ Anim.stand ] = new Anim(Anim.stand, [1],[1],true);
Anim.HeroAnim[ Anim.walk ] = new Anim(Anim.walk, [2,3,4,5,6,7,8,9,10,11],[1,1,1,1,1,1,1,1,1,1],true);
Anim.HeroAnim[ Anim.walkFront ] = new Anim(Anim.walkFront, [2,3,4,5,6,7,8,9,10,11],[1,1,1,1,1,1,1,1,1,1],true);
Anim.HeroAnim[ Anim.walkBack ] = new Anim(Anim.walkBack, [11,10,9,8,7,6,5,4,3,2],[1,1,1,1,1,1,1,1,1,1],true);
Anim.HeroAnim[ Anim.walkRight ] = new Anim(Anim.walkRight, [12,13,14,15,16,17,18,19,20,21],[1,1,1,1,1,1,1,1,1,1],true);
Anim.HeroAnim[ Anim.walkLeft ] = new Anim(Anim.walkLeft, [21,20,19,18,17,16,15,14,13,12],[1,1,1,1,1,1,1,1,1,1],true);
Anim.HeroAnim[ Anim.death ] = new Anim(Anim.death, [41,42,43,44,45],[4,4,3,3,3],false);
Anim.HeroAnim[ Anim.grabbed ] = new Anim(Anim.grabbed, [46,46],[2,2],true);
Anim.HeroAnim[ Anim.attack ] =  new Anim(Anim.attack, [26,27,28,29,30,41],[1,1,1,2,2,1],false);
Anim.HeroAnim[ Anim.sprint ] = new Anim(Anim.sprint, [31,32,33,34,35,36,37,38,39,40],[1,1,1,1,1,1,1,1,1,1],true);
//Anim.HeroAnim[ Anim.jump ] = new Anim(Anim.jump, [22,23,24,25,26,27],[1,1,1,2,3,1],false);

Anim.HeroBodyAnim = Anim.getEmpty();
Anim.HeroBodyAnim[ Anim.stand ] = new Anim(Anim.stand, [6],[1],true);
Anim.HeroBodyAnim[ Anim.attack_rifle ] =  new Anim(Anim.attack, [0,1,2,0],[1,1,3,5],false);
Anim.HeroBodyAnim[ Anim.attack_hip ] =  new Anim(Anim.attack, [3,4,5,3],[1,1,3,5],false);
Anim.HeroBodyAnim[ Anim.attack_hip_melee ] =  new Anim(Anim.attack, [3,22,23,24,25,3],[1,1,1,3,3,5],false);
Anim.HeroBodyAnim[ Anim.attack_rifle_melee ] =  new Anim(Anim.attack, [3,22,23,24,25,0],[1,1,1,3,3,5],false);
Anim.HeroBodyAnim[ Anim.attack_pistol ] =  new Anim(Anim.attack, [6,7,8,6],[1,1,3,5],false);
Anim.HeroBodyAnim[ Anim.attack_bomb ] =  new Anim(Anim.attack, [12,14,15,16,17,18,19,20,12],[1,1,1,1,1,2,1,1,1],false);
Anim.HeroBodyAnim[ Anim.attack_pistol_sword ] =  new Anim(Anim.attack, [9,10,10,11,6],[1,1,3,2,2],false);
Anim.HeroBodyAnim[ Anim.attack_pistol_sword_lunge ] =  new Anim(Anim.attack, [9,10,10,11,6],[1,5,4,2,2],false);
Anim.HeroBodyAnim[ Anim.attack_pistol_sword ].special_variant = Anim.attack_pistol_sword_lunge;
Anim.HeroBodyAnim[ Anim.attack_drink ] =  new Anim(Anim.attack, [19,19,21],[2,2,5],false);
Anim.HeroBodyAnim[ Anim.attack_violin ] =  new Anim(Anim.attack, [26,27,26,27,26,27],[5,3,3,5,2,2],true);
Anim.HeroBodyAnim[ Anim.attack_bomb_sword ] =  new Anim(Anim.attack, [9,10,10,11,12],[1,1,3,2,2],false);
Anim.HeroBodyAnim[ Anim.attack_bomb_sword_lunge ] =  new Anim(Anim.attack, [9,10,10,11,12],[1,5,4,2,2],false);
Anim.HeroBodyAnim[ Anim.attack_bomb_sword ].special_variant = Anim.attack_bomb_sword_lunge;
Anim.HeroBodyAnim[ Anim.switch_bomb ] =  new Anim(Anim.stand, [19,19,20,12],[1,1,1,5],false);
Anim.HeroBodyAnim[ Anim.attack_sword ] =  new Anim(Anim.attack, [20,10,10,11,20],[1,1,3,2,2],false);
Anim.HeroBodyAnim[ Anim.attack_sword_lunge ] =  new Anim(Anim.attack, [20,10,10,11,20],[1,5,4,2,2],false);
Anim.HeroBodyAnim[ Anim.attack_sword ].special_variant = Anim.attack_sword_lunge;
Anim.HeroBodyAnim[ Anim.attack_sword_chop ] =  new Anim(Anim.attack, [30,31,32,33,34,20],[2,2,1,1,3,4],false);
Anim.HeroBodyAnim[ Anim.attack_sword_chop ].special_variant = Anim.attack_sword_chop;
Anim.HeroBodyAnim[ Anim.attack_javelin ] =  new Anim(Anim.attack, [20,14,15,16,17,18,19,20],[1,1,1,1,1,2,1,1],false);
Anim.HeroBodyAnim[ Anim.attack ] =  Anim.HeroBodyAnim[Anim.attack_pistol];
Anim.HeroBodyAnim[ Anim.reload ] = new Anim(Anim.reload, [28,29],[2,3],true);
Anim.HeroBodyAnim[ Anim.charge] = new Anim(Anim.charge, [12,12],[3,2],true);

Anim.SMGAnim = Anim.getEmpty();
Anim.SMGAnim[ Anim.attack ] =  new Anim(Anim.attack, [0,1,0],[1,1,3],false);
Anim.BombAnim = Anim.getEmpty();
Anim.BombAnim[ Anim.attack ] =  new Anim(Anim.attack, [0,0,0],[3,3,3],false);
Anim.last.posKeys = [new AnimPosKey(0,0,0,0,1), new AnimPosKey(1,0,0,0,0),new AnimPosKey(8,0,0,0,0),new AnimPosKey(14,0,0,0,1)];

Anim.JavelinAnim  = Anim.getEmpty();
Anim.JavelinAnim[ Anim.attack ] =  new Anim(Anim.attack, [1,1,1,0],[1,5,3,2],false);
Anim.JavelinAnim[ Anim.charge ] =  new Anim(Anim.charge, [0,2],[3,3],false);

Anim.GrapplerAnim = Anim.getEmpty();
Anim.GrapplerAnim[ Anim.attack ] =  new Anim(Anim.attack, [1,1,1,0],[1,30,5,5],false);
Anim.GrapplerAnim[ Anim.birth] =  new Anim(Anim.attack, [1,1,0],[1,5,5],false);

Anim.PrivateAnim = Anim.getEmpty();
Anim.PrivateAnim[ Anim.stand ] = new Anim(Anim.stand, [0,1],[15,15],true);
Anim.PrivateAnim[ Anim.walk ] = new Anim(Anim.walk, [2,3,4,5,6,7,8,9,10,11],[1,1,1,1,1,1,1,1,1,1],true);
Anim.PrivateAnim[ Anim.attack ] = new Anim(Anim.attack, [12,13,14,15,16,17,12],[2,2,2,1,1,2,2],false);
Anim.PrivateAnim[ Anim.death ] = new Anim(Anim.death, [12,18,19,20,21,22,23],[4,4,2,2,2,2,10],false);
Anim.PrivateAnim[Anim.walk].randomStart = true;
Anim.PrivateAnim[Anim.stand].randomStart = true;
Anim.PrivateAnim[ Anim.grabbed ] = new Anim(Anim.grabbed, [24,24],[2,2],false);
Anim.PrivateAnim[ Anim.birth ] = new Anim(Anim.birth,[
25,26,27,28,29,
25,26,27,28,29,
25,26,27,28,29,
25,30,31,32,33,34,35,36,37,0],
[
2,2,2,2,2,
2,2,2,2,2,
2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2],false);
Anim.last.posKeys = [new AnimPosKey(0,0,-0.1,-2), new AnimPosKey(60,0,0,0)];
//rope birth
/*Anim.PrivateAnim[ Anim.birth ] = new Anim(Anim.birth, [
25,26,27,28,29,
25,26,27,28,29,
25,26,27,28,29,
25,30,31,32,33,34,35,36,37,0],
[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2],false);
Anim.last.posKeys = [new AnimPosKey(0,0,-0.25,-2), new AnimPosKey(60,0,0,0)];*/
Anim.PrivateAnim[Anim.birth_training ] = new Anim(Anim.birth, [2,3,4,5,6,7,8,9,10,11,2,3,4],[1,1,1,1,1,1,1,1,1,1,1,1,1], false);
Anim.last.posKeys = [new AnimPosKey(0,0,-1.2,0), new AnimPosKey(20,0,0,0)];
Anim.PrivateAnim[Anim.hang_end] = new Anim(Anim.stand, [42,36,37,0],[3,4,2,2], false);
Anim.last.posKeys = [new AnimPosKey(0,0,0,1.5), new AnimPosKey(6,0,0,0), new AnimPosKey(20,0,0,0)];

Anim.PrivateHorseAnim = Anim.getEmpty();
Anim.PrivateHorseAnim[Anim.stand] = new Anim(Anim.stand, [31,32], [15,15], true);
Anim.PrivateHorseAnim[Anim.walk] = new Anim(Anim.walk, [25,26], [9,8], true);
Anim.PrivateHorseAnim[Anim.walk].randomStart = true;
Anim.PrivateHorseAnim[ Anim.attack ] = new Anim(Anim.attack, [25,26,27,28,29,30,25],[2,2,2,1,1,2,2],false);
Anim.PrivateHorseAnim[ Anim.death ] = new Anim(Anim.death, [31,24],[5,5],false);

Anim.PrivateRifleAnim = Anim.getEmpty();
Anim.PrivateRifleAnim[ Anim.stand ] = Anim.PrivateAnim[ Anim.stand ];
Anim.PrivateRifleAnim[ Anim.walk ] = Anim.PrivateAnim[ Anim.walk ];
Anim.PrivateRifleAnim[ Anim.death ] = new Anim(Anim.death, [2,15,16,17,18],[4,4,3,3,3],false);
Anim.PrivateRifleAnim[ Anim.attack ] = new Anim(Anim.attack, [12,12,13,14,12],[3,1,1,2,5],false);
Anim.PrivateRifleAnim[ Anim.grabbed ] = new Anim(Anim.grabbed, [19,19],[2,2],true);
Anim.PrivateRifleAnim[ Anim.birth ] = new Anim(Anim.birth, 
[
20,21,22,23,24,
20,21,22,23,24,
20,21,22,23,24,
20,25,26,27,28,29,30,31,32,0],
[
2,2,2,2,2,
2,2,2,2,2,
2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2],false);
Anim.last.posKeys = [new AnimPosKey(0,0,-0.1,-2), new AnimPosKey(60,0,0,0)];
Anim.PrivateRifleAnim[ Anim.birth_training ] = Anim.PrivateAnim[ Anim.birth_training ];


Anim.HangedAnim = Anim.getEmpty();
Anim.HangedAnim[ Anim.hang_start] = new Anim(Anim.stand, [39,38,41,42,41],[1,2,1,2,1],false);
Anim.last.posKeys = [new AnimPosKey(0,0,0,1.5), new AnimPosKey(6,0,-0.01,1.4), new AnimPosKey(8,0,0.05,1.55),new AnimPosKey(14,0.02,-0.05,1.5)];
Anim.last.nextType = Anim.hang;
Anim.HangedAnim[ Anim.stand ] = new Anim(Anim.stand, [38,39],[9,9],true);
Anim.last.posKeys = [new AnimPosKey(0,0,0,1.5), new AnimPosKey(40,0,0,1.5)];
Anim.HangedAnim[ Anim.hang ] = new Anim(Anim.stand, [41,42,41,42],[4,5,7,15],true);
Anim.HangedAnim[ Anim.walk ] = Anim.last;
Anim.last.posKeys = [new AnimPosKey(0,0.02,-0.05,1.5), new AnimPosKey(30,-0.02,0.05,1.5), new AnimPosKey(65,0.02,-0.05,1.5)];
Anim.HangedAnim[ Anim.death ] = new Anim(Anim.death, [41,42,40],[3,4,10],false);
Anim.last.posKeys = [new AnimPosKey(0,0,0,1.5), new AnimPosKey(100,0,0,1.5)];

Anim.CaptainAnim = Anim.clone(Anim.PrivateAnim);
Anim.CaptainAnim[ Anim.death ] = new Anim(Anim.death, [12,21,22,23,24,25,26],[4,4,2,2,2,2,10],false);
Anim.CaptainPistolAnim = Anim.clone(Anim.CaptainAnim);
Anim.CaptainPistolAnim[ Anim.attack] = new Anim(Anim.attack, [18,19,20,18],[2,1,6,5],false);

Anim.SkirmisherAnim = Anim.clone(Anim.PrivateAnim);
Anim.SkirmisherAnim[Anim.attack] = new Anim(Anim.attack, [12,13,14,15,16,16,17,12],[2,2,2,1,1,2,3,2],false);

Anim.TurretAnim = Anim.getEmpty();
Anim.TurretAnim[ Anim.attack ] = new Anim(Anim.attack, [0,1,1,0],[1,2,5,1],false);

Anim.CannonAnim = Anim.getEmpty();
//Anim.CannonAnim[ Anim.walk ] = new Anim(Anim.walk, [0,2,3,4,5,6,7,8,9,10,11,12],[3,3,3,3,3,3,3,3,3,3,3,3],true);
Anim.CannonAnim[ Anim.walk ] = new Anim(Anim.walk, [0,2,3,4,5,6,7,8,9,10],[3,3,3,3,3,3,3,3,3,3],true); //18th century cannon
Anim.CannonAnim[ Anim.attack ] = new Anim(Anim.attack, [0,0,1,1,0],[5,1,3,16,1],false);
Anim.CannonAnim[ Anim.death ] = new Anim(Anim.death, [0,11,12,13], [3,3,3,3],false);

Anim.HorseAnim = Anim.getEmpty();
Anim.HorseAnim[ Anim.stand ] = new Anim(Anim.stand, [0,1],[17,17],true);
Anim.HorseAnim[ Anim.walk ] = new Anim(Anim.walk, [4,5,6,7,8,9,10,11,12,13, 2, 3],[1,1,1,1,1,1,1,1,1,1,1,1],true);
Anim.HorseAnim[ Anim.attack ] = new Anim(Anim.attack, [14,15,16,17,14], [2,2,4,2,6],false);
Anim.HorseAnim[ Anim.death ] = new Anim(Anim.death, [18,19,20,21,22,23], [3,3,3,2,1,2],false);
Anim.HorseAnim[ Anim.grabbed ] = new Anim(Anim.grabbed, [23,23],[2,4],false);

Anim.ChargerAnim = Anim.clone(Anim.HorseAnim);
Anim.ChargerAnim[ Anim.attack ] = new Anim(Anim.attack, [14,18,19,19,4,5,6,7,8,9,10,11,12,13,2,3,0], [2,4,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1],false);

Anim.CrateAnim = Anim.getEmpty();
Anim.CrateAnim[ Anim.death ] = new Anim(Anim.death, [0,3,4,5],[1,1,1,1],false);
Anim.CrateAnim[ Anim.birth ]  = new Anim(Anim.birth, [1,2,0],[2,2,1], false);

Anim.SwarmerAnim = Anim.getEmpty();
Anim.SwarmerAnim [ Anim.stand ] = new Anim(Anim.stand, [0,1],[15,10],true);
Anim.SwarmerAnim[ Anim.walk ] = new Anim(Anim.walk, [2,3,4,5,6,7,8,9,10,11],[1,1,1,1,1,1,1,1,1,1],true);
Anim.SwarmerAnim[ Anim.attack ] = new Anim(Anim.attack, [12,13,14,15,16,12],[2,2,2,2,2,2],false);
Anim.SwarmerAnim[Anim.walk].randomStart = true;
Anim.SwarmerAnim[ Anim.death ] = new Anim(Anim.death, [12,17,18,19,20],[1,2,2,2,2],false);
Anim.SwarmerAnim[ Anim.grabbed ] = new Anim(Anim.grabbed, [21,21],[2,4],false);
Anim.SwarmerAnim[ Anim.death_special] = Anim.SwarmerAnim[ Anim.death ];

Anim.TorsoAnim = Anim.getEmpty();
Anim.TorsoAnim[ Anim.stand ] = new Anim(Anim.stand, [4,5],[10,12],true);
Anim.TorsoAnim[ Anim.walk ] = new Anim(Anim.walk, [6,7,8,9,10],[2,2,2,2,2],true);
Anim.TorsoAnim[ Anim.attack ] = new Anim(Anim.attack, [11,12,13,11],[2,2,4,3],false);
Anim.TorsoAnim[Anim.walk].randomStart = true;
Anim.TorsoAnim[ Anim.death ] = new Anim(Anim.death, [11,4,3],[2,2,2],false);
Anim.TorsoAnim[ Anim.birth ] = new Anim(Anim.birth, [0,1,2,3,4],[3,2,1,3,1],false);
Anim.TorsoAnim[ Anim.grabbed ] = new Anim(Anim.grabbed, [3,3],[2,2],false);

Anim.SkeletonAnim = Anim.getEmpty();
Anim.SkeletonAnim[ Anim.stand ] = new Anim(Anim.stand, [0,1],[15,10],true);
Anim.SkeletonAnim[ Anim.walk ] = new Anim(Anim.walk, [2,3,4,5,6,7,8,9,10,11],[1,1,1,1,1,1,1,1,1,1],true);
Anim.SkeletonAnim[ Anim.attack ] = new Anim(Anim.attack, [12,13,14,15,16,12],[2,1,3,1,2,3],false);
Anim.SkeletonAnim[Anim.walk].randomStart = true;
Anim.SkeletonAnim[ Anim.death ] = new Anim(Anim.death, [12,17,18,19,20,21],[1,2,2,2,2,2],false);
Anim.SkeletonAnim[ Anim.birth ] = new Anim(Anim.birth, [22,23,24,25,26,12], [2,2,2,2,2,2], false);

Anim.SkeletonBabyAnim = Anim.clone(Anim.SkeletonAnim);
Anim.SkeletonBabyAnim[ Anim.stand ] = new Anim(Anim.stand, [0,1],[7,8],true);
Anim.SkeletonBabyAnim[ Anim.walk ] = new Anim(Anim.walk, [2,4,6,8,10],[1,1,1,1,1],true);

Anim.LancerAnim = Anim.getEmpty();
Anim.LancerAnim[ Anim.stand ] = new Anim(Anim.stand, [0,1],[15,10],true);
Anim.LancerAnim[ Anim.walk ] = new Anim(Anim.walk, [2,3,4,5,6,7,8,9,10],[1,1,1,1,1,1,1,1,1],true);
Anim.LancerAnim[ Anim.attack ] = new Anim(Anim.attack, [11,12,13,14,15,16,11],[3,2,1,2,2,2,2],false);
Anim.LancerAnim[Anim.walk].randomStart = true;
Anim.LancerAnim[ Anim.death ] = new Anim(Anim.death, [11,17,18,19,20],[1,2,2,2,2],false);
Anim.LancerAnim[ Anim.birth ] = new Anim(Anim.birth, [21,22,23,24,25,1], [2,2,2,2,2,2], false);

Anim.AdventurerAnim = Anim.getEmpty();
Anim.AdventurerAnim[ Anim.stand ] = new Anim(Anim.stand, [9,10],[15,10],true);
Anim.AdventurerAnim[ Anim.walk ] = new Anim(Anim.walk, [11,12,13,14,15,16,17,18,19,20],[1,1,1,1,1,1,1,1,1,1],true);
Anim.AdventurerAnim[ Anim.attack ] = new Anim(Anim.attack, [21,22,23,24,21],[4,1,1,2,3],false);
Anim.AdventurerAnim[Anim.walk].randomStart = true;
Anim.AdventurerAnim[ Anim.death ] = new Anim(Anim.death, [21,0,1,2,3],[1,2,2,2,2],false);
Anim.AdventurerAnim[ Anim.birth ] = new Anim(Anim.birth, [4,5,6,7,8,9], [2,2,2,2,2,2], false);

Anim.HuskAnim = Anim.getEmpty();
Anim.HuskAnim[ Anim.stand ] = new Anim(Anim.stand, [0,1],[5,6],true);
Anim.HuskAnim[ Anim.walk ] = new Anim(Anim.walk, [2,3,4,5,6,7,8,9,10,11],[1,1,1,1,1,1,1,1,1,1],true);
Anim.HuskAnim[ Anim.attack ] = new Anim(Anim.attack, [12,12,13,14,15,16,12],[2,1,1,2,2,2,2],false);
Anim.HuskAnim[Anim.walk].randomStart = true;
Anim.HuskAnim[ Anim.death ] = new Anim(Anim.death, [12,17,18,19,20],[2,3,3,2,2],false);
Anim.HuskAnim[ Anim.grabbed ] = new Anim(Anim.grabbed, [21,21],[2,4],false);


Anim.ImpAnim = Anim.getEmpty();
Anim.ImpAnim[ Anim.stand ] = new Anim(Anim.stand, [13,14],[8,9],true);
Anim.ImpAnim[ Anim.walk ] = new Anim(Anim.walk, [0,1,2,3,4,5],[2,2,2,2,2,2],true);
Anim.ImpAnim[ Anim.attack ] = new Anim(Anim.attack, [6,7,8,9,10,11,12,6],[1,1,2,3,1,3,2,1],false);
Anim.ImpAnim[Anim.walk].randomStart = true;
Anim.ImpAnim[ Anim.death ] = new Anim(Anim.death, [6,15,16,17,18],[3,3,3,3,3],false);
Anim.ImpAnim[ Anim.birth ] = new Anim(Anim.birth, [0,1,2,3,4,5],[2,2,2,2,2,2],false);

Anim.DemonAnim = Anim.clone(Anim.ImpAnim);
Anim.DemonAnim[ Anim.attack ] = new Anim(Anim.attack, [6,7,8,9,10,11,12,6],[2,2,4,8,1,3,2,1],false);

Anim.BehemothAnim = Anim.getEmpty();
Anim.BehemothAnim[ Anim.stand ] = new Anim(Anim.stand, [0,1],[24,24],true);
Anim.BehemothAnim[ Anim.walk ] = new Anim(Anim.walk, [2,3,4,5,6,7,8,9,10,11],[2,2,2,2,2,2,2,2,2,2],true);
Anim.BehemothAnim[Anim.walk].randomStart = true;
Anim.BehemothAnim [ Anim.attack ] = new Anim(Anim.attack, [12,13,14,15,16,17,12],[2,2,3,1,2,2,2],false);
Anim.BehemothAnim [ Anim.death ] = new Anim(Anim.death, [12,18,19,20,21],[6,5,4,2,2],false);

Anim.SharkAnim = Anim.getEmpty();
Anim.SharkAnim[ Anim.stand ] = new Anim(Anim.stand, [0,1],[17,17],true);
Anim.SharkAnim[ Anim.walk ] = new Anim(Anim.walk, [2,3,4,5,6,7,8,9,10,11],[1,1,1,1,1,1,1,1,1,1],true);
Anim.SharkAnim[Anim.walk].randomStart = true;
Anim.SharkAnim [ Anim.attack ] = new Anim(Anim.attack, [12,13,14,15,16,17,12],[2,2,3,1,2,2,2],false);
Anim.SharkAnim [ Anim.death ] = new Anim(Anim.death, [12,18,19,20,21],[4,4,3,2,2],false);

Anim.CannonSharkAnim = Anim.getEmpty();
Anim.CannonSharkAnim[ Anim.stand ] = new Anim(Anim.stand, [11,12],[17,17],true);
Anim.CannonSharkAnim[ Anim.walk ] = new Anim(Anim.walk, [1,2,3,4,5,6,7,8,9,10],[2,2,2,2,2,2,2,2,2,2],true);
Anim.CannonSharkAnim[Anim.walk].randomStart = true;
Anim.CannonSharkAnim[ Anim.attack ] = new Anim(Anim.attack, [11,12,13,14,15,11],[1,1,1,5,5,5],false);
Anim.CannonSharkAnim[ Anim.death ] = new Anim(Anim.death, [11,16,17,18,19],[4,3,3,3,2],false);

Anim.GrenadeSharkAnim = Anim.clone(Anim.CannonSharkAnim);
Anim.GrenadeSharkAnim[ Anim.stand ] = new Anim(Anim.stand, [11,12],[18,16],true);
Anim.GrenadeSharkAnim[ Anim.walk ] = new Anim(Anim.walk, [1,2,3,4,5,6,7,8,9,10],[1,1,1,1,1,1,1,1,1,1],true);

Anim.MaggotAnim = Anim.getEmpty();
Anim.MaggotAnim[ Anim.stand ] = new Anim(Anim.stand, [1,2],[20,20],true);
Anim.MaggotAnim[ Anim.walk ] = new Anim(Anim.walk, [1,2,3,4,5,6],[2,2,2,2,2,2],true);
Anim.MaggotAnim[Anim.walk].randomStart = true;
Anim.MaggotAnim [ Anim.attack ] = new Anim(Anim.attack, [7,8,9,10,11,7],[2,2,1,2,3,2],false);
Anim.MaggotAnim [ Anim.death ] = new Anim(Anim.death, [7,12,13,14],[3,3,3,3],false);
Anim.MaggotAnim [ Anim.birth ] = new Anim(Anim.birth, [15,16,17,1],[3,3,3,3],false);

Anim.MiniMaggotAnim = Anim.getEmpty();
Anim.MiniMaggotAnim[ Anim.stand ] = new Anim(Anim.stand, [1,2],[15,15],true);
Anim.MiniMaggotAnim[ Anim.walk ] = new Anim(Anim.walk, [1,2,3,4,5,6],[1,1,1,1,1,1],true);
Anim.MiniMaggotAnim[Anim.walk].randomStart = true;
Anim.MiniMaggotAnim [ Anim.attack ] = new Anim(Anim.attack, [7,8,9,10,11,7],[1,1,1,1,2,1],false);
Anim.MiniMaggotAnim [ Anim.death ] = new Anim(Anim.death, [7,12,13,14],[2,2,2,2],false);
Anim.MiniMaggotAnim [ Anim.birth ] = new Anim(Anim.birth, [15,16,17,1],[2,2,2,2],false);
Anim.MiniMaggotAnim[ Anim.grabbed ] = new Anim(Anim.grabbed, [12,13],[2,2],false);

Anim.GhoulAnim = Anim.getEmpty();
Anim.GhoulAnim [ Anim.walk ] = new Anim(Anim.walk, [1,2,3,4,5],[2,2,2,2,2],true);
Anim.GhoulAnim [Anim.walk].randomStart = true;
Anim.GhoulAnim [ Anim.attack ] = new Anim(Anim.attack, [6,7,8,9,6],[2,2,1,2,3],false);
Anim.GhoulAnim [ Anim.death ] = new Anim(Anim.death, [6,10,11,12,13],[2,2,2,2,2],false);

Anim.LizardAnim = Anim.clone(Anim.GhoulAnim);
Anim.LizardAnim[Anim.stand] = new Anim(Anim.stand, [5,6],[16,14],true);
Anim.LizardAnim[Anim.walk ] = new Anim(Anim.walk, [0,1,2,3,4],[2,2,2,2,2],true);
Anim.LizardAnim[Anim.walk].randomStart = true;
Anim.LizardAnim[Anim.grabbed] = new Anim(Anim.grabbed, [13,13],[2,2],false);

Anim.LizardChargeAnim = Anim.clone(Anim.LizardAnim);
Anim.LizardChargeAnim[Anim.attack] = new Anim(Anim.attack, [10,6,7,3,4,0,1,2,3,4,0,1],[5,10,2,3,2,2,2,2,2,2,1,1],false);
Anim.last.posKeys = [new AnimPosKey(0,0,0,0), new AnimPosKey(34,0,0,0), new AnimPosKey(39,0,0,0.5),new AnimPosKey(45,0,0,0)];

Anim.SalamanderAnim = Anim.clone(Anim.LizardAnim);
Anim.SalamanderAnim[Anim.attack] = new Anim(Anim.attack, [6,7,8,9,6],[3,3,5,3,3],false);

Anim.SnapperAnim = Anim.clone(Anim.LizardAnim);
Anim.SnapperAnim[Anim.stand] = new Anim(Anim.stand, [5,6],[4,5],true);
Anim.SnapperAnim[Anim.walk ] = new Anim(Anim.walk, [0,1,2,3,4],[1,1,1,1,1],true);

Anim.SnakeAnim = Anim.getEmpty();
Anim.SnakeAnim[Anim.stand] = new Anim(Anim.stand, [5,0],[35,38],true);
Anim.SnakeAnim[ Anim.walk ] = new Anim(Anim.walk, [0,1,2,3,4,5],[2,2,2,2,2,2],true);
Anim.last.randomStart = true;
Anim.SnakeAnim[Anim.attack] = new Anim(Anim.attack, [6,7,8,9,6],[3,2,1,5,4],false);
Anim.SnakeAnim[Anim.death] = new Anim(Anim.death, [6,10,11,12,13,14],[2,3,2,3,2,2],false);

Anim.CrabAnim = Anim.clone(Anim.GhoulAnim);
Anim.CrabAnim[Anim.stand] = new Anim(Anim.stand, [0,1],[13,10],true);
Anim.CrabAnim[Anim.walk ] = new Anim(Anim.walk, [2,3,4,5,6,7,8],[1,1,1,1,1,1,1],true);
Anim.last.randomStart = true;
Anim.CrabAnim[Anim.birth ] = new Anim(Anim.birth, [2,3,4,5,6,7,8],[2,2,2,1,1,1,1],false);
Anim.last.posKeys = [new AnimPosKey(0,0,0,-0.5,0.6), new AnimPosKey(14,0,0,0,1)];
Anim.CrabAnim[Anim.attack ] = new Anim(Anim.attack, [9,10,11,12,13,14,15,9],[1,1,1,2,2,3,3,3],false);
Anim.CrabAnim[Anim.death ] = new Anim(Anim.death, [9,16],[2,2],false);
Anim.CrabAnim[Anim.grabbed] = new Anim(Anim.grabbed, [16,16],[2,2],false);

Anim.SpiderAnim = Anim.getEmpty();
Anim.SpiderAnim[Anim.stand] = new Anim(Anim.stand, [0,1],[9,8],true);
Anim.SpiderAnim[Anim.walk ] = new Anim(Anim.walk, [2,3,4,5,6,7],[1,1,1,1,1,1],true);
Anim.last.randomStart = true;
Anim.SpiderAnim[Anim.attack ] = new Anim(Anim.attack, [8,9,10,11,12,13,8],[2,1,1,1,2,2,2],false);
Anim.SpiderAnim[Anim.death ] = new Anim(Anim.death, [8,14,15],[2,2,2],false);
Anim.last.posKeys = [new AnimPosKey(0,0,0,0), new AnimPosKey(3,0,0,0.4),  new AnimPosKey(8,0,0,0)];
Anim.SpiderAnim[Anim.grabbed ] = new Anim(Anim.grabbed, [14,15],[2,3],false);
Anim.SpiderAnim[Anim.birth ] = new Anim(Anim.birth, [2,3,4,5,0],[1,1,1,1,3],false);
Anim.last.posKeys = [new AnimPosKey(0,0,0,0,0.2), new AnimPosKey(5,0,0,0,1)];

Anim.SpiderQueenAnim = Anim.clone(Anim.SpiderAnim);
Anim.SpiderQueenAnim[Anim.walk ] = new Anim(Anim.walk, [2,3,4,5,6,7],[2,2,2,2,2,2],true);

Anim.WaspAnim = Anim.getEmpty();
Anim.WaspAnim[Anim.walk] = new Anim(Anim.walk, [0,1,2,3,4,5],[2,2,2,2,2,2],true);
Anim.WaspAnim[Anim.stand] = new Anim(Anim.stand, [0,1,2,3,4,5],[2,2,2,2,2,2],true);
Anim.WaspAnim[Anim.attack] = new Anim(Anim.attack, [0,6,7,8,9,10,0,1,2,3,4,5],[2,2,2,1,1,2,2,2,2,2,2,2],false);
Anim.WaspAnim[Anim.death] = new Anim(Anim.death, [11,12,13,14,15,16,17],[1,1,1,1,2,2,3],false);
Anim.WaspAnim[Anim.birth] = new Anim(Anim.birth, 
[0,1,2,3,4,5,0,1,2,3,4,5,0,1,2,3,4,5],
[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],false);
Anim.last.posKeys = [new AnimPosKey(0,0,-8,3), new AnimPosKey(72,0,0,0)];
Anim.WaspAnim[Anim.grabbed] = new Anim(Anim.grabbed, [16,17],[2,2],false);

Anim.ElephantAnim = Anim.getEmpty();
Anim.ElephantAnim[Anim.stand] = new Anim(Anim.stand, [17,18],[15,15],true);
Anim.ElephantAnim[Anim.walk ] = new Anim(Anim.walk, [9,10,11,12,13,14,15,16],[2,2,2,2,2,2,2,2],true);
Anim.last.randomStart = true;
Anim.ElephantAnim[Anim.attack ] = new Anim(Anim.attack, [18,19,20,21,22,23,24,25,18],[2,2,2,2,2,2,2,3,3],false);
Anim.ElephantAnim[Anim.death ] = new Anim(Anim.death, [18,26,27,28,29,31,31],[3,3,3,2,2,2,2],false);

Anim.ElephantRunningAnim = Anim.clone(Anim.ElephantAnim);
Anim.ElephantRunningAnim[Anim.walk ]= new Anim(Anim.walk, [1,2,3,4,5,6,7,8],[2,2,2,2,2,2,2,2],true);
Anim.last.randomStart = true;

Anim.ElementalAnim = Anim.getEmpty();
Anim.ElementalAnim [Anim.stand] = new Anim(Anim.stand, [0,1,2,3],[4,4,4,4],true);
Anim.ElementalAnim [Anim.walk] = new Anim(Anim.walk, [4,5,6,7,8,9],[2,2,2,2,2,2],true);
Anim.ElementalAnim [Anim.attack] = new Anim(Anim.attack, [10,11,12,13,14,15,10],[3,2,1,1,2,3,3],false);
Anim.ElementalAnim [Anim.death] = new Anim(Anim.death, [10,16,17,18,19,20,21],[2,2,2,2,2,2,2],false);
Anim.last.posKeys = [new AnimPosKey(0,0,0,0), new AnimPosKey(20,0,0,-0.11), new AnimPosKey(1000,0,0,-0.11)];

Anim.TentAnim = Anim.getEmpty();
Anim.TentAnim[ Anim.birth ] = new Anim(Anim.birth, [2,1,0],[3,4,5],false);
Anim.TentAnim[ Anim.death ] = new Anim(Anim.death, [0,1,2],[5,4,3],false);
Anim.TowerAnim = Anim.getEmpty();
Anim.TowerAnim[ Anim.death ] = new Anim(Anim.death, [0,1,2,3,4],[3,7,4,3,3],false);
Anim.WallAnim = Anim.getEmpty();
Anim.WallAnim[ Anim.birth ] = new Anim(Anim.birth, [2,1,0],[3,4,5],false);
Anim.WallAnim[ Anim.death ] = new Anim(Anim.death, [0,1,2],[3,3,3],false);
Anim.RocksAnim = Anim.getEmpty();
Anim.RocksAnim[ Anim.death ] = new Anim(Anim.death, [0,1,2,3,4,5,6,7,8],[2,2,2,2,2,2,2,2,2],false);

Anim.CannonDebrisAnim = Anim.getEmpty();
Anim.CannonDebrisAnim[ Anim.stand ] = new Anim(Anim.stand, [0,1,2,3,4,5,6,7],[2,2,2,2,2,2,2,2],false);
Anim.BulletDebrisAnim = Anim.getEmpty();
Anim.BulletDebrisAnim[ Anim.stand ] = new Anim(Anim.stand, [0,1,2,3,4,5,6],[1,1,1,1,1,1,1],false);

Anim.BloodsplatterAnim = Anim.getEmpty();
Anim.BloodsplatterAnim[ Anim.stand ] = new Anim(Anim.attack, [0,1,2,3],[1,2,2,2],false);

Anim.RainAnim = Anim.getEmpty();
Anim.RainAnim[ Anim.stand ] = new Anim(Anim.stand,[0,1],[30,0], true);

Anim.WaveAnim = Anim.getEmpty();
Anim.WaveAnim[ Anim.stand ] = new Anim(Anim.attack, [9,8,7,6,5,4,3,2,1,0,0],[10,10,10,10,10,10,10,10,10,10,50],true);
Anim.last.blendStart=false;

Anim.WaveLongAnim = Anim.getEmpty();
Anim.WaveLongAnim[ Anim.stand ] = new Anim(Anim.attack, [0,1,2,3,4,5,6,7,7],[50,50,40,30,20,20,30,30,10],true);
Anim.last.blendStart=false;

Anim.EquipmentAnim = Anim.getEmpty();
Anim.EquipmentAnim[Anim.stand].posKeys = [new AnimPosKey(0,0,0,0.4), new AnimPosKey(60,0,0,0.4)];
Anim.EquipmentAnim[ Anim.death ]  = new Anim(Anim.birth, [0,0],[4,1],false);
Anim.last.posKeys = [new AnimPosKey(0,0,0,0.4,1), new AnimPosKey(6,0,0,0.5,0.01),new AnimPosKey(20,0,0,0.5,0.01)];

Anim.FireballAnim = Anim.getEmpty();
Anim.FireballAnim[ Anim.stand ] = new Anim(Anim.stand, [0,1,2,3,4,5],[2,2,2,2,2,2],true);

Anim.RopeAnim = Anim.getEmpty();
Anim.RopeAnim[ Anim.stand ] = new Anim(Anim.stand, [5],[1],true);
Anim.RopeAnim[ Anim.birth ] = new Anim(Anim.birth, [0,1,2,3,4,5],[5,3,3,2,2,2],false);

Anim.ItemAnim = Anim.getEmpty();
Anim.ItemAnim[ Anim.birth ]  = new Anim(Anim.birth, [0,0],[4,1],false);
Anim.last.posKeys = [new AnimPosKey(0,0,0,0.2,0), new AnimPosKey(8,0,0,0,1)];
Anim.ItemAnim[ Anim.death ]  = new Anim(Anim.death, [0,0],[4,1],false);
Anim.last.posKeys = [new AnimPosKey(0,0,0,0,1), new AnimPosKey(6,0,0,0.5,0.01),new AnimPosKey(20,0,0,0.5,0.01)];

Anim.FishAnim = Anim.getEmpty();
Anim.FishAnim[ Anim.stand ] = new Anim(Anim.stand,[0,1,2,3],[4,4,4,4], true);

Anim.BigFishAnim = Anim.getEmpty();
Anim.BigFishAnim[ Anim.stand ] = new Anim(Anim.stand,[0,1,2,3],[15,15,15,15], true);

Anim.ButterflyAnim = Anim.getEmpty();
Anim.ButterflyAnim[ Anim.stand ] = new Anim(Anim.stand,[0,1,2,3,4,5],[1,1,1,1,1,1], true);
Anim.BatAnim = Anim.getEmpty();
Anim.BatAnim[ Anim.stand ] = new Anim(Anim.stand,[0,2,4],[1,1,1], true);

Anim.PalisadeTowerAnim = Anim.getEmpty();
Anim.PalisadeTowerAnim[ Anim.death ]  = new Anim(Anim.death, [0,1,2,3,4],[4,4,4,4,4],false);

Anim.EggAnim = Anim.getEmpty();
Anim.EggAnim[ Anim.death ]  = new Anim(Anim.death, [0,1,2],[4,3,3],false);

Anim.createJumpAnim = function(unit, endPos){
	var xyDistance = Unit_Distance(unit, endPos);
	var distance = Unit_Distance_3d(unit, endPos);
	var zdiff = unit.z-endPos.z;
	var stepcount = Math.ceil(distance*3+3);
	//we need a parabola from (1,zdiff) to (0,0)
	var a = -2.5;
	var b = zdiff-a;
	if(unit == Gamestats.Hero){
		var frameArr = [0,22,23,24,25,0];
		var frameTimeArr = [2,2,Math.max(stepcount/2-2,3),1,2,1];
	}else{
		var frameArr = [unit.proto.animCollection[Anim.attack].frames[0]];
		var frameTimeArr = [stepcount/2+4];
	}
	
	var posKeys = [new AnimPosKey(0,0,-xyDistance,zdiff,1)];
	
	for(var i=0;i<=stepcount;++i){
		var interp = 1-i/stepcount;
		posKeys.push(new AnimPosKey( i+3, 0,-interp*xyDistance, a*interp*interp+b*interp,1));
	}
	
	var anim = new Anim(Anim.jump, frameArr, frameTimeArr, false);
	anim.posKeys = posKeys;
	return anim;
}